package main

import "fmt"

type dog struct {
	name string
}

type person struct {
	name    string
	age     int
	lixiang []string
}
type myint int

func (m myint) SayHello() {
	fmt.Println("Hello, 我是一个int。")
}

//构造函数
func newdog(name string) *dog {
	return &dog{
		name: name,
	}
}
func newperson(name string, age int, lixinag []string) *person {
	return &person{
		name:    name,
		age:     age,
		lixiang: lixinag,
	}
}

//方法 指针接受者
func (p *person) guonian() {
	p.age++
}

//方法
//方法式是作用于特定类型的函数
//接受者表示的是调用该方法的具体类型变量，多用类型名首字母小写表示
//值接受者  拷贝
func (d dog) wang() {
	fmt.Printf("%s:呜呜呜呜呜", d.name)
}

func main() {
	fmt.Println("方法和接受者 ")
	f1 := newdog("wjp")
	f1.wang()
	fmt.Println(`标识符 ：变量名，函数名，类型名，方法名
	go语言如果标识符首字符是大写，就表示对外部包可见（暴露的公开的）
	首字母大写的   上面要加上注释 // Dog 这是一个dog的结构体  
	注意空格一定要有`)
	j1 := newperson("元帅", 18, []string{"1"})
	fmt.Println(j1.age)
	j1.guonian()
	fmt.Println(j1.age)
	fmt.Println(`什么时候应该使用指针类型接收者`)
	fmt.Println(`需要修改接收者中的值
	接收者是拷贝代价比较大的大对象
	保证一致性，如果有某个方法使用了指针接收者，那么其他的方法也应该使用指针接收者。`)
	//给自定义类型加方法
	//不能给别的包里的类型加方法
	//var m1 myint  方式1
	m1 := myint(100) //强制类型转换 方式2
	m1.SayHello()    //Hello, 我是一个int。
	// m1 = 100
	fmt.Printf("%#v  %T\n", m1, m1) //100  main.MyInt
}
